package code09集合;

import java.util.*;

/**
 * @author 黄衡熙
 * @version 1.0
 */
public class Test02_练习 {
    public static void main(String[] args) {
        test03();
    }

    public static void test01() {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个字符串:");
        String s = sc.nextLine();
        HashMap<Character, Integer> map = new HashMap<>();
        // 遍历字符串中的每一个字符
        for (int i = 0; i < s.length(); i++) {
            // 取出当前迭代的字符
            char c = s.charAt(i);
            // 判断集合中是否已经存在key为c的数据了
            if (map.containsKey(c)) {
                // 如果已经存在,则说明已经出现过了
                // 因此,其出现次数+1
                map.put(c, map.get(c) + 1);
            } else {
                // 如果没有出现过,则其次数值为1
                map.put(c, 1);
            }
        }
        System.out.println(map);
    }

    public static void test02() {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个字符串:");
        String s = sc.nextLine();
        HashMap<Character, Integer> map = new HashMap<>();
        while (!s.isEmpty()) {
            // 取出这个字符串中的第一个字符
            char c = s.charAt(0);
            // 将该字符串中所有与第一个字符一致的字符全部替换成空字符串
            String s2 = s.replace(c + "", "");
            // 计算替换前的字符串与替换后的字符长度的差距
            // 其字符串长度减少了多少,则表示该字符出现了几次
            map.put(c, s.length() - s2.length());
            // 将新的字符串s2赋值给原来的字符串s再次进入循环执行替换操作
            s = s2;
        }
        System.out.println(map);
    }

    public static void test03() {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入一个字符串:");
        String s = sc.nextLine();
        HashMap<Character, Integer> map = new HashMap<>();
        // 遍历字符串中的每一个字符
        for (int i = 0; i < s.length(); i++) {
            // 取出当前迭代的字符
            char c = s.charAt(i);
            map.put(c, map.containsKey(c) ? map.get(c) + 1 : 1);
        }
        System.out.println(map);
        System.out.println("************************************");
        // 通过排序,打印输出次数最多的前三个字符及次数
        Set<Map.Entry<Character, Integer>> entries = map.entrySet();
        List<Map.Entry<Character, Integer>> list = new ArrayList<>(entries);

        // 根据Map集合中的value的值进行降序排序
        Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() {
            @Override
            public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
                if (o1.getValue() > o2.getValue()) {
                    return -1;
                } else if (o1.getValue() < o2.getValue()) {
                    return 1;
                }
                return 0;
            }
        });
        System.out.println(list);

        // 取出前三个元素
        System.out.println("输出次数最多的前三个字符及次数如下:");
        for (int i = 0; i < 3; i++) {
            Map.Entry<Character, Integer> entry = list.get(i);
            System.out.println("字符" + entry.getKey() + "出现了" + entry.getValue() + "次");
        }
    }
}
